package org.jboss.jpa.impl.test.beanvalidation;
import java.sql.DriverManager;
import java.util.List;
import java.util.ArrayList;
import java.util.Properties;
import java.net.URL;
import javax.transaction.TransactionManager;
import javax.naming.InitialContext;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceException;
import javax.validation.ConstraintViolationException;
import org.hsqldb.jdbcDriver;
import org.jnp.server.SingletonNamingServer;
import org.jboss.jpa.impl.test.common.MockPersistenceUnit;
import org.jboss.jpa.impl.test.common.Person;
import org.jboss.jpa.impl.deployment.PersistenceUnitInfoImpl;
import org.jboss.jpa.spi.PersistenceUnitRegistry;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.fail;
import static org.junit.Assert.assertEquals;
import org.hibernate.ejb.HibernatePersistence;
import org.hibernate.transaction.JBossTransactionManagerLookup;
import com.arjuna.ats.jta.utils.JNDIManager;
/**
* @author Emmanuel Bernard
*/
public class MinimalBeanValidationTestCase
{
private static jdbcDriver driver;
private static SingletonNamingServer namingServer;
private static TransactionManager transactionManager;
private MockPersistenceUnit persistenceUnit;
@AfterClass
public static void afterClass() throws Exception
{
new InitialContext().unbind("java:/TransactionManager");
namingServer.destroy();
DriverManager.deregisterDriver(driver);
}
@BeforeClass
public static void beforeClass() throws Exception
{
driver = new jdbcDriver();
DriverManager.registerDriver(driver);
namingServer = new SingletonNamingServer();
JNDIManager.bindJTAImplementation();
transactionManager = (TransactionManager) new InitialContext().lookup("java:/TransactionManager");
}
@After
public void after() throws Exception
{
PersistenceUnitRegistry.unregister(persistenceUnit);
persistenceUnit.stop();
}
@Before
public void before() throws Exception
{
List<String> entityClassNames = new ArrayList<String>();
entityClassNames.add(Person.class.getName());
PersistenceUnitInfoImpl pui = new PersistenceUnitInfoImpl();
pui.setClassLoader(Thread.currentThread().getContextClassLoader());
List<URL> jarFiles = new ArrayList<URL>();
pui.setJarFiles(jarFiles);
pui.setManagedClassnames(entityClassNames);
List<String> mappingFileNames = new ArrayList<String>();
pui.setMappingFileNames(mappingFileNames);
pui.setPersistenceProviderClassName(HibernatePersistence.class.getName());
pui.setPersistenceUnitName("TestPersistenceUnit");
Properties properties = new Properties();
properties.put("hibernate.connection.url", "jdbc:hsqldb:mem:testdb");
properties.put("hibernate.connection.user", "sa");
properties.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
properties.put("hibernate.hbm2ddl.auto", "create");
//properties.put("hibernate.transaction.manager_lookup_class", MockTransactionManagerLookup.class.getName());
properties.put("hibernate.transaction.manager_lookup_class", JBossTransactionManagerLookup.class.getName());
pui.setProperties(properties);
MockPersistenceUnit persistenceUnit = new MockPersistenceUnit(pui);
this.persistenceUnit = persistenceUnit;
persistenceUnit.start();
PersistenceUnitRegistry.register(persistenceUnit);
}
@Test
//This does *not* test the proper creation and injection of BV as we use a mock persistenceunit
//in fact BV is initialized by Hibernate in this case
public void testBeanValidation() throws Exception
{
transactionManager.begin();
EntityManager em = persistenceUnit.getContainerEntityManagerFactory().createEntityManager();
try
{
Person p = new Person();
p.setId(2);
p.setName("Caroline");
p.setNickname("C"); //invalid nickname
em.persist(p);
em.joinTransaction();
em.flush();
fail("Bean validation should have been triggered");
}
catch (ConstraintViolationException e)
{
//success
}
catch (PersistenceException e)
{
assertEquals("Should be a validation exception", e.getCause().getClass(), ConstraintViolationException.class);
}
finally
{
transactionManager.rollback();
em.close();
}
}
}